package com.easoft.code.pos.ui.controllers;

import com.easoft.code.pos.ui.controllers.exception.ControllerException;
import com.easoft.code.pos.App;
import com.easoft.code.pos.data.dao.GenericDao;
import com.easoft.code.pos.data.exception.CoreDataLayerException;
import com.easoft.code.pos.data.pojos.Bodega;
import com.easoft.code.pos.data.pojos.CargaInventario;
import com.easoft.code.pos.data.pojos.DocumentoOperTipo;
import com.easoft.code.pos.data.pojos.MovimientoInv;
import com.easoft.code.pos.data.pojos.MovimientoInvDet;
import com.easoft.code.pos.data.pojos.PosCaja;
import com.easoft.code.pos.data.pojos.PosUsuario;
import com.easoft.code.pos.data.pojos.Producto;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 *
 * @author Eliu
 */
public class CargaMasivaController {

    private final GenericDao dao = GenericDao.getMe();
    private CargaResumen resumen;
    private XSSFSheet hojaDatos;
    private File refFile;

    public DocumentoOperTipo getCargaDefaultOper() {
        return null;
    }

    /**
     *
     * @param avance
     * @param skipRows
     * @return
     * @throws ControllerException
     */
    public CargaResumen processCarga(javax.swing.JLabel avance, int skipRows) throws ControllerException {
        CargaInventario ci;
        PosUsuario user = new PosUsuario("eliu");
        try {
            ci = new CargaInventario();
            ci.setArchivoRespaldo(refFile.getAbsolutePath());
            ci.setFechaCarga(Calendar.getInstance().getTime());
            ci.setPosUsuario(user);
            dao.save(ci);
        } catch (CoreDataLayerException ex) {
            throw new ControllerException("Error guardando encabezado de carga!", ex);
        }
        try {
            SimpleDateFormat sd = new SimpleDateFormat("ddMMyyyy");
            int cc = 0;
            PosCaja caja = new POSController().getCaja(App.caja);
            Bodega bodega = new POSController().getBodega(caja.getDefBodega().getId());
            MovimientoInv mov = new MovimientoInv();
            mov.setBodega(bodega);

            mov.setFechaEmision(Calendar.getInstance().getTime());
            mov.setOperacionInv(getCargaDefaultOper().getOperacionInv());
            mov.setDocumentoMovId(null);
            mov.setPosUsuario(user);
            mov.setBodega(bodega);
            Integer movId = (Integer) dao.save(mov);
            mov.setId(movId);

            for (Row r : hojaDatos) {
                if (cc > skipRows) {
                    Iterator<Cell> cr = r.iterator();
                    Cell c = cr.next();
                    MovimientoInvDet det = new MovimientoInvDet();
                    Producto p = new Producto(c.getStringCellValue());
                    det.setProductoCodigo(new POSController().getProductoByCodigo(p));
                    c = cr.next();
                    det.setCantidad((float) c.getNumericCellValue());
                    det.setDescuentoAuto(0f);
                    det.setDescuentoManual(0f);
                    det.setTotal(det.getCantidad() * det.getProductoCodigo().getPrecioCosto());
                    det.setTotalNeto(0f);
                    det.setPrecioVenta(0f);
                    det.setPrecioCosto(0f);
                    det.setGanancia(0f);
                    det.setMovimientoInvId(mov);
                    dao.save(det);

                    System.out.println("Guardado... detalle..." + cc);
                }
                cc++;
                avance.setText("Filas: " + cc);
            }
            resumen.setTotalFilasOk(cc);
            dao.update(mov);

        } catch (CoreDataLayerException ex) {
            throw new ControllerException("Error procesando carga!!", ex);
        }

        return resumen;
    }

    /**
     *
     * @param file
     * @param skipRows
     * @return
     */
    public CargaResumen getCargaResumen(File file, int skipRows) {
        try {
            try (FileInputStream fi = new FileInputStream(file)) {
                XSSFWorkbook wb = new XSSFWorkbook(fi);
                XSSFSheet sheet = wb.getSheetAt(0);
                Iterator<Row> rowIterator = sheet.iterator();
                int total = 0;
                while (rowIterator.hasNext()) {
                    if (rowIterator.next().iterator().next().getStringCellValue().isEmpty()) {
                        break;
                    }
                    total++;
                    System.out.println(total);
                }
                resumen = new CargaResumen();
                resumen.setTotalFilas(total - skipRows);
                hojaDatos = sheet;
            }
            this.refFile = file;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(CargaMasivaController.class
                    .getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(CargaMasivaController.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
        return resumen;
    }
}
